﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegateAndEvent
{
    //定义事件参数：观察者关心的内容
    public class UserEventArgs : EventArgs
    {
        public string Email;
        public string Mobile;
        public string Amount;

        public UserEventArgs(string email, string mobile, string amount)
        {
            Email = email;
            Mobile = mobile;
            Amount = amount;
        }
    }

    //事件发布者：银行
    public class Bank
    {
        //声明委托：银行交易
        public delegate void ProcessTranEventHandler(Object sender,UserEventArgs e);
        //声明事件
        public event ProcessTranEventHandler ProcessTran;

        //事件处理
        protected virtual void OnProcessTran(UserEventArgs e)
        {
            if (ProcessTran != null)
            {
                ProcessTran(this,e);
            }
        }

        //触发事件
        public void Process(UserEventArgs e) {
            OnProcessTran(e);
        }

    }

    //事件观察者:电子邮件
    public class Email
        {
            public static void SendMail(object sender, UserEventArgs e) {
                Console.WriteLine(
                    $"向用户邮箱{e.Email}发送邮件：您在{System.DateTime.Now}取款金额为{e.Amount}元"
                    );
            }
        }

    //事件观察者:短信
    public class MobileSMS
        {
            public static void SendNotification(object sender, UserEventArgs e) {
                Console.WriteLine(
                    $"向用户邮箱{e.Mobile}发送邮件：您在{System.DateTime.Now}取款金额为{e.Amount}元"
                    );
            }
        }

    //订阅系统：松耦合
    public class SubscribeSystem
    {
        public SubscribeSystem() { }
        public SubscribeSystem(Bank bank,UserEventArgs e) {
            bank.ProcessTran += Email.SendMail;
            bank.ProcessTran += MobileSMS.SendNotification;
            bank.Process(e);
        }
    }
}
